#include "opFactory.h"

Fabrica_Operaciones::Fabrica_Operaciones(){}

Fabrica_Operaciones::~Fabrica_Operaciones(){}
	
Fabrica_Operaciones::Fabrica_Operaciones(Fabrica_Operaciones &f){}
	
Operacion* Fabrica_Operaciones::crear_operacion(std::string& param){
	Operacion *op = 0; 
	
	//aca armo la cadena de operaciones desde el ultimo eslabon hacia
	//el primero
	
	Manejador_Creacion manejador_estadistica(this,ESTADISTICA);
	Manejador_Creacion manejador_op_fin(this,FIN, &manejador_estadistica);
	Manejador_Creacion manejador_op_eliminar(this,ELIMINAR, &manejador_op_fin);
	Manejador_Creacion manejador_op_crear(this,CREAR, &manejador_op_eliminar);
	Manejador_Creacion manejador_op_consulta(this,CONSULTA, &manejador_op_crear);
	Manejador_Creacion manejador_op_quitar(this,QUITAR, &manejador_op_consulta);
	Manejador_Creacion manejador_op_ingresar(this,INGRESAR, &manejador_op_quitar);
	Manejador_Creacion manejador_op_crear_ind(this,CREAR_IND, &manejador_op_ingresar);
	Manejador_Creacion manejador_op_actualizar(this, ACTUALIZAR, &manejador_op_crear_ind);
	
	if( param[0] == '#' ) //para comentarios
		return NULL;
	if(param[param.size() - 1] == ';')
		param.erase(param.size()-1,1);
	
	Parser::revisar_pcoma_dentro_struct(param);	
	//ejecuto la primera de la cadena y se van ejecutando en cascada de ser
	//necesario.
	try{
		op = manejador_op_actualizar.obtener_operacion_nueva(param);	
	}
	catch(std::runtime_error & err){
		if(op != NULL){
			delete op;
			op = NULL;
		}
		//si no hubo ninguna operacion lanzo error
		throw err;
	}
	return op;
}
//metodo de creacion
Operacion* Fabrica_Operaciones::obtener_instancia_operacion(char tipo, std::string& param){
	try{
		switch(tipo){
			case INGRESAR: 		return OperacionIngresar::construir(param);
					  			break;
			case ESTADISTICA: 	return OperacionEstadistica::construir(param);
					  			break;
			case FIN: 			return OperacionFin::construir(param);
								break;
			case ELIMINAR:		return OperacionEliminar::construir(param);
								break;
			case CREAR:			return OperacionCrear::construir(param);
								break;
			case CONSULTA:		return OperacionConsulta::construir(param);
								break;					
			case QUITAR:		return OperacionQuitar::construir(param);
								break;
			case CREAR_IND:		return OperacionCrearIndSec::construir(param);
								break;
			case ACTUALIZAR:	return OperacionActualizar::construir(param);
								break;
			default: 			return 0;
		}
	}
	catch(std::runtime_error &err){
		throw err;
	}
}
